package BinaryTree;

public class BinaryTree {
    public Node root;

    class Node {
        Node left;
        Node right;
        String value;

        Node(String value) {
            this.value = value;
        }
    }


    public String nodeLeftValue(Node node) {
        return node.left.value;
    }

    public String nodeRightValue(Node node) {
        return node.right.value;
    }

    public boolean isLeaf(Node node) {
        return node.left == null && node.right == null;
    }

    public boolean hasLeft(Node node) {
        return node.left != null;
    }

    public boolean hasRight(Node node) {
        return node.right != null;
    }



    public void addNode(String value, String where) {
        addNodeToTree(value, root, where);
    }

    public void addNodeToTree(String value, Node node, String whereToPut) {
        if (root == null) {
            root = new Node(value);
            System.out.println("создан корневой элемент " + root.value);
            return;
        }
        if (whereToPut.equals("toLeft")) {
            if (node.left == null) {
                node.left = new Node(value);
            } else addNodeToTree(value, node.left, whereToPut);
        } else {
            if (node.right == null) {
                node.right = new Node(value);
            } else addNodeToTree(value, node.right, whereToPut);
        }
    }



    @Override
    public String toString() {
        return toStringToNode(root);
    }

    public String toStringToNode(Node node) {
        if (node == null) {
            return "корень пустой";
        }
        String left = (!hasLeft(node) ? "левый элемент пустой; " : nodeLeftValue(node));
        String right = (!hasRight(node) ? "правый элемент пустой; " : nodeRightValue(node) + " ");
        System.out.println("корень - " + node.value + "; левый - " + left + "; правый - " + right);
        toStringToNode(node.left);
        toStringToNode(node.right);
        return "корень - " + node.value + "; левый - " + left + "; правый - " + right;
    }



    public int showHeight() {
        return getHeight(root);
    }

    public int getHeight(Node node) {
        int h = 0;
        if (isLeaf(node)) {
            return 0;
        } else {
            if (hasLeft(node))
                h = Math.max(h, getHeight(node.left));
            if (hasRight(node))
                h = Math.max(h, getHeight(node.right));
            return h + 1;
        }
    }
}
